﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml;
using System.Xml.Linq;
using METODESA.Server.Data.Exceptions;
using METODESA.Server.Data.METODESA.Entity;
using METODESA.Server.Data.METODESA.Factorys;
using METODESA.Server.Data.METODESA.Nhibernate;
using Metodesa.Logic;
using Metodesa.Tools;
using NHibernate;

namespace Metodesa.Views.Home
{
    public partial class ListReparacion : Page
    {
        private static HtmlTable tableReparacion;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (ValidatorFecha1.ValidationExpression.Equals(""))
            {
                loadExpressions();
            }
            if (ValidatorFecha1.ErrorMessage.Equals(""))
            {
                loadMessages();
            }

            label.Visible = false;
            ListReparaciones.Visible = false;
            PanelAddReparacion.Visible = false;
            PanelEditReparacion.Visible = false;
            if (Session["User"] != null)
            {
                Empleado usuario = (Empleado)Session["User"];
            }
            else
            {
                Response.Redirect("../../Views/Home/Index.aspx", true);
            }

            String action = Request.QueryString.Get("a");

            if (action != null)
            {

                if (action.Equals("s")) // Select for update
                {
                    prepareDetailsUpdate();  //Preparo el panel para hacer Update
                }
                else if (action.Equals("d"))
                {
                    // DELETE
                   delete();
                }
                else if (action.Equals("p"))
                {
                    PanelAddReparacion.Visible = true;
                }


            }
            else
                PanelEditReparacion.Visible = false;
        }

        /// <summary>
        /// Procedimiento para reunir la informacion para borrar
        /// y borrar la reparacion
        /// </summary>
        private void delete()
        {
            int ids = int.Parse(Request.QueryString.Get("id"));
            try
            {
                ReparacionLogic.delete(ids);
                label.Visible = true;
                label.ForeColor = Color.Blue;
                label.Text = "Reparacion eliminada satifactoriamente";
            }
            #region manejo de errores
            catch (EntityCouldntBeDeleted exception)
            {
                label.Visible = true;
                label.ForeColor = Color.Red;
                label.Text = exception.Message;
                Session.Add("Error", exception);

            }
            catch (HibernateException exception)
            {
                label.Visible = true;
                label.ForeColor = Color.Red;
                label.Text = "Reparacion no se puede borrar";
                Session.Add("Error", exception);
            }
            catch (Exception exception)
            {
                Session.Add("Error", exception);
                Response.Redirect("../../Views/Home/Error.aspx", true);

            }
            #endregion
        }
        /// <summary>
        /// Procedimiento para cargar los mensajes del XML
        /// </summary>
        private void loadMessages()
        {
            XmlDocument xDoc = new XmlDocument();
            string path = Path.Combine(Server.MapPath("~"), @"Messages.xml");
            xDoc.Load(path);

            XmlNodeList lista = xDoc.GetElementsByTagName("message");
            foreach (XmlElement element in lista)
            {
                if (element.GetAttribute("name").Equals("requeridoFecha"))
                {
                    RequiredFieldFecha1.ErrorMessage = element.GetAttribute("error");
                    RequiredFieldFecha2.ErrorMessage = element.GetAttribute("error");

                }
                else if (element.GetAttribute("name").Equals("requeridoPrecio"))
                {
                    RequiredFieldPrecio1.ErrorMessage = element.GetAttribute("error");
                    RequiredFieldPrecio2.ErrorMessage = element.GetAttribute("error");

                }
                else if (element.GetAttribute("name").Equals("fechaMayor"))
                {
                    ValidatorRango.ErrorMessage = element.GetAttribute("error");
                    ValidatorRango2.ErrorMessage = element.GetAttribute("error");
                }
                else if (element.GetAttribute("name").Equals("formatoFecha"))
                {
                    ValidatorFecha1.ErrorMessage = element.GetAttribute("error");
                    ValidatorFecha2.ErrorMessage = element.GetAttribute("error");
                    ValidatorFecha3.ErrorMessage = element.GetAttribute("error");
                    ValidatorFecha4.ErrorMessage = element.GetAttribute("error");
                }
                else if (element.GetAttribute("name").Equals("formatoPrecio"))
                {
                    ValidatorPrecio.ErrorMessage = element.GetAttribute("error");
                    ValidatorPrecio2.ErrorMessage = element.GetAttribute("error");
                }

            }

        }

        /// <summary>
        /// Procedimiento para cargar las expresiones regulares del XML
        /// </summary>
        private void loadExpressions()
        {
            XmlDocument xDoc = new XmlDocument();
            string path = Path.Combine(Server.MapPath("~"), @"Validations.xml");
            xDoc.Load(path);

            XmlNodeList lista = xDoc.GetElementsByTagName("validation");
            foreach (XmlElement element in lista)
            {
                if (element.GetAttribute("name").Equals("fecha"))
                {
                    ValidatorFecha1.ValidationExpression = element.GetAttribute("expression");
                    ValidatorFecha2.ValidationExpression = element.GetAttribute("expression");
                    ValidatorFecha3.ValidationExpression = element.GetAttribute("expression");
                    ValidatorFecha4.ValidationExpression = element.GetAttribute("expression");
                }
                else if (element.GetAttribute("name").Equals("precio"))
                {
                    ValidatorPrecio.ValidationExpression = element.GetAttribute("expression");
                    ValidatorPrecio2.ValidationExpression = element.GetAttribute("expression");
                }

            }

        }


        private void prepareDetailsUpdate() // Metodo para preparar el panel de detalles para hacer el Update
        {
            int ids;
            PanelAddReparacion.Visible = false;
            PanelEditReparacion.Visible = true; // Hacer Visible el panel de detalles
            ids = int.Parse(Request.QueryString.Get("id"));
            Servicio reparacion = ReparacionDao.getReparacionesByCode_individual(ids); // Busco la instalacion seleccionado por codigo
            teId.Text = ids.ToString();
            teFecha_Ini.Text = reparacion.FechaInicio;
            teFecha_Fin.Text = reparacion.FechaFin;        // Asigno todos los textBox los valores q tiene la instalacion
            tePrecio.Text = reparacion.Precio.ToString();
            teDescripcion.Text = reparacion.Descripcion;

        }

       
        /// <summary>
        /// Procedimiento para Modificar
        /// </summary>
        private void EditReparacion()
        {

            try
            {

                ReparacionLogic.update(int.Parse(teId.Text), teFecha_Ini.Text, teFecha_Fin.Text, double.Parse(tePrecio.Text), teDescripcion.Text);
                
                label.Visible = true;
                label.ForeColor = Color.Blue;
                label.Text = "Reparacion mofificada satifactoriamente";
            }
            catch (EntityCouldntBeUpdated exception)
            {
                Session.Add("Error", exception);
                label.Visible = true;
                label.ForeColor = Color.Red;
                label.Text = "No se pudo modificar la reparación";
                PanelAddReparacion.Visible = true;
            }
            catch (Exception exception)
            {
                Session.Add("Error", exception);
                Response.Redirect("../../Views/Home/Error.aspx", true);
            }
        }


        /// <summary>
        /// Procedimiento para cargar el panel para agregar
        /// </summary>
        private void prepareDetailsAdd()
        {
            ListReparaciones.Visible = false;
            PanelAddReparacion.Visible = true;

            taFecha_Ini.Text = "";
            taFecha_Fin.Text = "";
            taPrecio.Text = "";
            taDescripcion.Text = "";
        }

        /// <summary>
        /// Procedimiento para agregar una reparacion
        /// Si ocurre una excepcion inesperada se redirige hacia la pagina de error
        /// si ocurre una excepcion de NHibernate se muestra el mensaje de error
        /// </summary>
        private void AddReparacion()
        {
            PanelAddReparacion.Visible = false;
            PanelEditReparacion.Visible = false;

            Session.Add("field", null);
            Session.Add("selected", null);

           try { // Intento agregar la reparacion
               ReparacionLogic.add(taFecha_Ini.Text, taFecha_Fin.Text,double.Parse(taPrecio.Text), taDescripcion.Text);
               label.Visible = true;
                label.ForeColor = Color.Blue; // Si no dio error muestro un mensaje
                label.Text = "Reparación agregada satifactoriamente";
               
            }
           catch (EntityCouldntBeSaved exception)
            {
                Session.Add("Error", exception); // Agrego La excepcion 
                label.Visible = true;
                label.ForeColor = Color.Red;
                label.Text = "No se pudo agregar la reparación";
                PanelAddReparacion.Visible = true;
            }
            catch(Exception exception)
            {   
                Session.Add("Error",exception);
                Response.Redirect("../../Views/Home/Error.aspx", true);
            }
        }
        /// <summary>
        /// Accion del boton de para activar el panel de agregar
        /// se llama a la funcion prepareDetailsAdd
        /// </summary>
        protected void PrepareAddButton_Click(object sender, EventArgs e)
        {
            prepareDetailsAdd();
        }


        protected void FindButton_Click(object sender, EventArgs e)
        {
            IList<Servicio> lista;
            if (option != null && option.SelectedItem != null)
                lista = ReparacionLogic.processSearch(searchbox.Text, option.SelectedValue);
            else
                lista = ReparacionLogic.processSearch(searchbox.Text, "");

            HtmlTable table = ReparacionesTools.ListReparacion(lista);


            if (table != null)
            {
                ListReparaciones.Controls.Add(table);
                ListReparaciones.Visible = true;
            }
            else
            {
                label.Visible = true;
                label.ForeColor = Color.DarkRed;
                label.Text = "No se encontraron reparaciones que cumplan con la búsqueda";
            }
        }



        protected void EditButton_Click(object sender, EventArgs e)
        {
            EditReparacion();
        }

        protected void AddButton_Click(object sender, EventArgs e)
        {
            AddReparacion();
        }




        protected void Calendar1_SelectionChanged(object sender, EventArgs e)
        {
            teFecha_Ini.Text = Calendar1.SelectedDate.ToShortDateString();
        }

        protected void Calendar2_SelectionChanged(object sender, EventArgs e)
        {
            teFecha_Fin.Text = Calendar2.SelectedDate.ToShortDateString();
        }

        protected void Calendar3_SelectionChanged(object sender, EventArgs e)
        {
            PanelAddReparacion.Visible = true;

            taFecha_Ini.Text = Calendar3.SelectedDate.ToShortDateString();
        }
        protected void Calendar4_SelectionChanged(object sender, EventArgs e)
        {
            PanelAddReparacion.Visible = true;
            taFecha_Fin.Text = Calendar4.SelectedDate.ToShortDateString();
        }


    }
}

